В числовой последовательности a1, a2, a3,
... известен первый член, а каждый следующий
вычисляется по следующей формуле:
ai = (ai-1
* ai-1) mod
10000
Найдите n-ый
член этой последовательности.
Вход. В первой строке заданы два целых числа a1 и n (0 ≤ a1 ≤ 10000, 1 ≤ n ≤ 2000000010).
Выход. Выведите одно целое число an.
Пример
входа |
Пример
выхода |
4 3 |
256 |
возведение
в степень
Выразим первые члены последовательности через a1:
·
a2 = a12
mod 10000,
·
a3 = a22
mod 10000 = a14
mod 10000,
·
a4 = a32
mod 10000 = a24
mod 10000 = a18
mod 10000
Таким образом, формулу можно записать в виде:
ai = ai-12
mod 10000
Откуда следует, что для
вычисления an достаточно возвести a1 в степень 2n–1 по модулю 10000:
ab mod n
= ab mod j(n) mod n,
для получения результата res следует выполнить следующие вычисления:
·
Вычислить значение x = 2n–1 mod j(10000) = 2n–1 mod 4000,
·
Затем вычислить res = a1x mod 10000
Функция PowMod вычисляет
значение xn mod m.
int PowMod(int
x, int n, int
m)
{
if (n == 0) return 1;
if (n % 2 ==
0) return PowMod((x * x) % m, n / 2, m);
return (x *
PowMod(x, n - 1, m)) % m;
}
Читаем входные данные.
scanf("%d %d",&a,&n);
Вычисляем x = 2n–1 mod 4000. После чего находим и выводим ответ:
res = ax mod 10000
x =
PowMod(2,n-1,4000);
res =
PowMod(a,x,10000);
printf("%d\n",res);
import java.util.*;
public class Main
{
static long PowMod(long x, long n, long m)
{
if (n == 0) return 1;
if (n % 2 == 0) return PowMod((x * x) % m, n / 2, m);
return (x * PowMod(x, n - 1, m)) % m;
}
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
long a = con.nextLong();
long n = con.nextLong();
long x = PowMod(2,n-1,4000);
long res = PowMod(a,x,10000);
System.out.println(res);
con.close();
}
}